package com.itdct.cozecd.bo

import com.alibaba.fastjson2.annotation.JSONField

class ChatBo {
    /**
     * 可选
     * 对话的附加信息。你可以通过此字段传入历史消息和本次对话中用户的问题。数组长度限制为 100，即最多传入 100 条消息。
     * 若未设置 additional_messages，智能体收到的消息只有会话中已有的消息内容，其中最后一条作为本次对话的用户输入，其他内容均为本次对话的上下文。
     * 若设置了 additional_messages，智能体收到的消息包括会话中已有的消息和 additional_messages 中添加的消息，其中 additional_messages 最后一条消息会作为本次对话的用户输入，其他内容均为本次对话的上下文。
     * 消息结构可参考EnterMessage Object，具体示例可参考携带上下文。
     * 会话或 additional_messages 中最后一条消息应为 role=user 的记录，以免影响模型效果。
     * 如果本次对话未指定会话或指定的会话中无消息时，必须通过此参数传入智能体用户的问题。
     */
    @JSONField(name = "additional_messages")
    var additionalMessages = ArrayList<AdditionalMessage>()

    /**
     * 必填
     * 标识当前与智能体对话的用户，由使用方自行定义、生成与维护。user_id 用于标识对话中的不同用户，不同的 user_id，其对话的上下文消息、数据库等对话记忆数据互相隔离。如果不需要用户数据隔离，可将此参数固定为一个任意字符串，例如 123，abc 等。
     * 出于数据隐私及信息安全等方面的考虑，不建议使用业务系统中定义的用户 ID。
     */
    @JSONField(name = "user_id")
    var userId: String? = null

    /**
     * 可选
     * 是否启用流式返回。
     * true：采用流式响应。 “流式响应” 将模型的实时响应提供给客户端，类似打字机效果。你可以实时获取服务端返回的对话、消息事件，并在客户端中同步处理、实时展示，也可以直接在 completed 事件中获取智能体最终的回复。
     * false：（默认）采用非流式响应。 “非流式响应” 是指响应中仅包含本次对话的状态等元数据。此时应同时开启 auto_save_history，在本次对话处理结束后再查看模型回复等完整响应内容。可以参考以下业务流程：
     * a. 调用发起会话接口，并设置 stream = false，auto_save_history=true，表示使用非流式响应，并记录历史消息。
     * 你需要记录会话的 Conversation ID 和 Chat ID，用于后续查看详细信息。
     * b. 定期轮询查看对话详情接口，建议每次间隔 1 秒以上，直到会话状态流转为终态，即 status 为 completed、required_action、canceled 或 failed。
     * c. 调用查看对话消息详情接口，查询大模型生成的最终结果。
     */
    var stream = false

    /**
     * 必填
     * 要进行会话聊天的智能体 ID。
     * 进入智能体的 开发页面，开发页面 URL 中 bot 参数后的数字就是智能体 ID。例如
     * https://www.coze.cn/space/341/bot/73428668*****，智能体 ID 为73428668*****。
     * 确保当前使用的访问密钥已被授予智能体所属空间的 chat 权限。
     */
    @JSONField(name = "bot_id")
    var botId: String? = null

    /**
     * 可选
     * 是否保存本次对话记录。
     * true：（默认）会话中保存本次对话记录，包括 additional_messages 中指定的所有消息、本次对话的模型回复结果、模型执行中间结果。
     * false：会话中不保存本次对话记录，后续也无法通过任何方式查看本次对话信息、消息详情。在同一个会话中再次发起对话时，本次会话也不会作为上下文传递给模型。
     * 非流式响应下（stream=false），此参数必须设置为 true，即保存本次对话记录，否则无法查看对话状态和模型回复。
     * 调用端插件时，此参数必须设置为 true，即保存本次对话记录，否则提交工具执行结果时会提示 5000 错误，端插件的详细 API 使用示例请参见通过 API 使用端插件。
     */
    @JSONField(name = "auto_save_history")
    var autoSaveHistory = true

    /**
     * 可选
     * 标识对话发生在哪一次会话中。
     * 会话是 Bot 和用户之间的一段问答交互。一个会话包含一条或多条消息。对话是会话中对 Bot 的一次调用，Bot 会将对话中产生的消息添加到会话中。
     * 可以使用已创建的会话，会话中已存在的消息将作为上下文传递给模型。创建会话的方式可参考创建会话。
     * 对于一问一答等不需要区分 conversation 的场合可不传该参数，系统会自动生成一个会话
     * 一个会话中，只能有一个进行中的对话，否则调用此接口时会报错 4016。
     */
    var conversationId:String? = null
}

class AdditionalMessage {
    /**
     * 角色信息，默认user
     * 发送这条消息的实体。取值：
     * user：代表该条消息内容是用户发送的。
     * assistant：代表该条消息内容是智能体发送的。
     */
    var role = "user"

    /**
     * 消息内容的类型，支持设置为：
     * text：文本。
     * object_string：多模态内容，即文本和文件的组合、文本和图片的组合。
     * card：卡片。此枚举值仅在接口响应中出现，不支持作为入参。
     */
    @JSONField(name = "content_type")
    var contentType = "text"

    /***
     * 创建消息时的附加消息，查看消息列表时也会返回此附加消息。
     * 自定义键值对，应指定为 Map 对象格式。长度为 16 对键值对，其中键（key）的长度范围为 1～64 个字符，值（value）的长度范围为 1～512 个字符。
     */
    @JSONField(name = "meta_data")
    var metaData: HashMap<String, String>? = null

    /**
     * 消息类型。默认为 question。
     * question：用户输入内容。
     * answer：智能体返回给用户的消息内容，支持增量返回。如果工作流绑定了消息节点，可能会存在多 answer 场景，此时可以用流式返回的结束标志来判断所有 answer 完成。
     * function_call：智能体对话过程中调用函数（function call）的中间结果。
     * tool_response：调用工具 （function call）后返回的结果。
     * follow_up：如果在 智能体上配置打开了用户问题建议开关，则会返回推荐问题相关的回复内容。不支持在请求中作为入参。
     * verbose：多 answer 场景下，服务端会返回一个 verbose 包，对应的 content 为 JSON 格式，content.msg_type =generate_answer_finish 代表全部 answer 回复完成。不支持在请求中作为入参。
     */
    var type: String? = null

    /**
     * 消息的内容，支持纯文本、多模态（文本、图片、文件混合输入）、卡片等多种类型的内容。
     * content_type 为 object_string 时，content 为 object_string object 数组序列化之后的 JSON String，详细说明可参考 object_string object。
     * 当 content_type = text 时，content 为普通文本，例如 "content" :"Hello!"。
     */
    var content: String? = null
}
